home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 1.iso / toolbox / src / exampleCode / opengl / motif / drawWidget.c < prev    next >
C/C++ Source or Header  |  1996-11-11  |  10KB  |  346 lines

  1. /*
  2.  * Copyright (c) 1995, Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that the name of Silicon Graphics may not be used in any advertising or
  7.  * publicity relating to the software without the specific, prior written
  8.  * permission of Silicon Graphics.
  9.  *
  10.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
  11.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  12.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  13.  *
  14.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
  15.  * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
  16.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE
  17.  * POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN
  18.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19.  *
  20.  * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
  21.  */
  22. /****
  23. *
  24. *  drawWidget.c
  25. *
  26. *  A. LaGrone, 1994
  27. *
  28. ****/
  29. #include <string.h>        
  30. #include <stdio.h>
  31. #include <stdlib.h>
  32. #include <Xm/Xm.h>
  33. #include <Xm/PushB.h>
  34. #include <Xm/ToggleB.h>
  35. #include <Xm/MenuShell.h>
  36. #include <Xm/CascadeB.h>
  37. #include <Xm/RowColumn.h>
  38. #include <Xm/MainW.h>
  39. #include <Xm/XmStrDefs.h>
  40. #include <X11/Shell.h>
  41. #include <GL/gl.h>             
  42. #include <GL/glu.h>           
  43. #include <GL/GLwMDrawA.h>    
  44.  
  45. int double_buffer = FALSE;
  46. Dimension window_width, window_height;
  47. Widget Mainwin, dialog_form, TopLevel;
  48. Widget gl_double, gl_single;
  49. Display *dpy;
  50. XtAppContext appContext;
  51. GLXContext glxc_single, glxc_double;
  52. void drawScene(void);
  53.  
  54. void 
  55. drawScene()
  56. {
  57.    GLUquadricObj *quadObj, *quadObj2, *quadObj3;
  58.  
  59.    glLoadIdentity();
  60.    glClearColor(0.,0.,0.,0.);
  61.  
  62.    glClear(GL_COLOR_BUFFER_BIT);
  63.  
  64.    glColor3f(0.0, 1.0, 0.0);
  65.  
  66.    quadObj = gluNewQuadric();
  67.    gluQuadricDrawStyle(quadObj, GLU_FILL);
  68.    gluQuadricOrientation(quadObj, GLU_OUTSIDE);
  69.    gluQuadricNormals(quadObj, GLU_SMOOTH);
  70.     
  71.    gluSphere(quadObj,.2,30,30);
  72.  
  73.    glPushMatrix();
  74.       glTranslatef(.5, .5, 0.);
  75.       glColor3f(1.0, 1.0, 0.0);
  76.       quadObj2 = gluNewQuadric();
  77.       gluQuadricDrawStyle(quadObj2, GLU_FILL);
  78.       gluQuadricOrientation(quadObj2, GLU_OUTSIDE);
  79.       gluQuadricNormals(quadObj2, GLU_SMOOTH);
  80.  
  81.       gluSphere(quadObj2,.2,30,30);
  82.  
  83.       glTranslatef(-1.1, -1.1, 0.);
  84.       glColor3f(1.0, 0.0, 1.0);
  85.       quadObj2 = gluNewQuadric();
  86.       gluQuadricDrawStyle(quadObj2, GLU_FILL);
  87.       gluQuadricOrientation(quadObj2, GLU_OUTSIDE);
  88.       gluQuadricNormals(quadObj2, GLU_SMOOTH);
  89.  
  90.       gluSphere(quadObj2,.2,30,30);
  91.    glPopMatrix();
  92.  
  93.    if (double_buffer) {
  94.     glXSwapBuffers(dpy, XtWindow(gl_double));
  95.    }
  96. }
  97.  
  98. void quit_action(Widget w, XtPointer arg_int, XmAnyCallbackStruct *call_data)
  99. {
  100.     exit(0);
  101. }
  102.  
  103. void expose_button_action(Widget w, XtPointer arg_int, 
  104.                           XmAnyCallbackStruct *call_data)
  105. {
  106.    printf("Received expose callback for dialog widget\n");
  107. }
  108.  
  109. void pbutton3_action(Widget w, XtPointer arg_int, 
  110.                      XmAnyCallbackStruct *call_data)
  111. {
  112.    XtUnmanageChild(gl_double);
  113.    XtManageChild(gl_single);
  114.    GLwDrawingAreaMakeCurrent(gl_single, glxc_single);
  115.    double_buffer = FALSE;
  116.    drawScene();
  117. }
  118.  
  119. void pbutton4_action(Widget w, XtPointer arg_int, 
  120.                      XmAnyCallbackStruct *call_data)
  121. {
  122.    XtUnmanageChild(gl_single);
  123.    XtManageChild(gl_double);
  124.    GLwDrawingAreaMakeCurrent(gl_double, glxc_double);
  125.    double_buffer = TRUE;
  126.    drawScene();
  127. }
  128.  
  129. void pbutton5_action(Widget w, XtPointer arg_int, 
  130.              XmAnyCallbackStruct *call_data)
  131. {
  132.    int i;
  133.    
  134.    for (i = 0; i< 100; i++) {
  135.        drawScene();
  136.    }
  137. }
  138.  
  139. void doubleExposeCB(Widget w, XtPointer *cd, XtPointer *call)
  140. {
  141.     GLwDrawingAreaMakeCurrent(w, glxc_double);
  142.     drawScene();
  143. }
  144.  
  145. void singleExposeCB(Widget w, XtPointer *cd, XtPointer *call)
  146. {
  147.     GLwDrawingAreaMakeCurrent(w, glxc_single);
  148.     drawScene();
  149. }
  150.  
  151. void doubleInitCB(Widget w, XtPointer *cd, XtPointer *call)
  152. {
  153.     XVisualInfo *vi;
  154.     GLwDrawingAreaCallbackStruct *draw_struct;
  155.     draw_struct = (GLwDrawingAreaCallbackStruct *) call;
  156.  
  157.     XtVaGetValues(w, GLwNvisualInfo, &vi, NULL);
  158.  
  159.     glxc_double = glXCreateContext(XtDisplay(w), vi, 0, GL_TRUE);
  160.  
  161.     GLwDrawingAreaMakeCurrent(w, glxc_double);
  162.     glMatrixMode(GL_PROJECTION);
  163.     glOrtho(-1.1,1.1,-1.1,1.1,-1.1,1.1);
  164.     glMatrixMode(GL_MODELVIEW);
  165.     glLoadIdentity();
  166.     glViewport(10, 10, 400,400);
  167. }
  168.  
  169. void singleInitCB(Widget w, XtPointer *cd, XtPointer *call)
  170. {
  171.     XVisualInfo *vi;
  172.     GLwDrawingAreaCallbackStruct *draw_struct;
  173.     draw_struct = (GLwDrawingAreaCallbackStruct *) call;
  174.  
  175.     XtVaGetValues(w, GLwNvisualInfo, &vi, NULL);
  176.  
  177.     glxc_single = glXCreateContext(XtDisplay(w), vi, 0, GL_TRUE);
  178.  
  179.     GLwDrawingAreaMakeCurrent(w, glxc_single);
  180.     glMatrixMode(GL_PROJECTION);
  181.     glOrtho(-1.1,1.1,-1.1,1.1,-1.1,1.1);
  182.     glMatrixMode(GL_MODELVIEW);
  183.     glLoadIdentity();
  184.     glViewport(0, 0, 400,400);
  185. }
  186.  
  187. void create_opengl_window(Widget parent)
  188. {
  189.   void doubleExposeCB(), singleExposeCB();
  190.   void doubleInitCB(), singleInitCB();
  191.  
  192.         gl_double = XtVaCreateWidget("doublebuf", glwMDrawingAreaWidgetClass, 
  193.             parent,
  194.             GLwNrgba, TRUE,
  195.             GLwNdoublebuffer, TRUE,
  196.             NULL); /* double buffered widget */
  197.  
  198.         XtAddCallback(gl_double, GLwNexposeCallback, doubleExposeCB, NULL);
  199.         XtAddCallback(gl_double, GLwNginitCallback,  doubleInitCB,   NULL);
  200.  
  201.         XtManageChild(gl_double);
  202.  
  203.     gl_single = XtVaCreateWidget("singlebuf", glwMDrawingAreaWidgetClass, 
  204.             parent,
  205.                         GLwNrgba, TRUE,
  206.                         GLwNdoublebuffer, FALSE,
  207.                         NULL); /* single buffered widget */
  208.        
  209.         XtAddCallback(gl_single, GLwNexposeCallback, singleExposeCB, NULL);
  210.         XtAddCallback(gl_single, GLwNginitCallback,  singleInitCB,   NULL); 
  211.  
  212.     /* map single buffered widget */
  213.  
  214.         XtUnmanageChild(gl_double);
  215.     XtManageChild(gl_single);
  216.  
  217.         GLwDrawingAreaMakeCurrent(gl_single, glxc_single);
  218.         drawScene();
  219. }
  220.  
  221. main(argc, argv)
  222. int argc;
  223. char *argv[];
  224. {
  225.     Arg args[10];
  226.     int argcnt=0;
  227.     int screen;
  228.     Widget button, pulldown, menubar, quit;
  229.     Widget pulldownshell, pbutton3, pbutton4, pbutton5;
  230.     Window root;
  231.     XEvent queue_event;
  232.     void quit_action();
  233.     void pbutton3_action();
  234.     void pbutton4_action();
  235.     void pbutton5_action();
  236.  
  237.         XtToolkitInitialize();
  238.         appContext = XtCreateApplicationContext();
  239.         dpy = XtOpenDisplay(appContext, NULL, NULL, "Test", 
  240.                   NULL ,0, &argc, (String *)argv);
  241.  
  242.         /* get the screen id 'screen */
  243.         screen = DefaultScreen(dpy);
  244.  
  245.         /* get the root window 'root' */
  246.         root = RootWindow(dpy, screen);
  247.  
  248.         TopLevel = XtAppCreateShell(NULL, "Test", applicationShellWidgetClass,
  249.                     dpy, args, 0);
  250.  
  251.         /* Create the mainwindow */
  252.     Mainwin = XtVaCreateManagedWidget( "x1", xmMainWindowWidgetClass,
  253.             TopLevel, XmNwidth, 400, XmNheight, 400, 
  254.             XmNresizePolicy, XmRESIZE_ANY, 
  255.             XmNmainWindowMarginHeight, 0,
  256.             XmNmainWindowMarginWidth, 0,
  257.             XmNborderWidth, 0,
  258.             NULL);
  259.  
  260.         /* Create the menubar */
  261.     menubar = XtVaCreateManagedWidget( "menubar", xmRowColumnWidgetClass,
  262.             Mainwin, 
  263.             XmNrowColumnType, XmMENU_BAR,
  264.             XmNwidth, 301, XmNheight, 60,
  265.             NULL);
  266.  
  267.         /* Create the opengl window as a child of the main window */
  268.         create_opengl_window(Mainwin);
  269.  
  270.         XtVaSetValues(gl_double, 
  271.                         XmNx, 0,
  272.             XmNy, 40,
  273.             XmNwidth, 400,
  274.             XmNheight, 400,
  275.             NULL);
  276.  
  277.         XtVaSetValues(gl_single, 
  278.                         XmNx, 0,
  279.             XmNy, 40,
  280.             XmNwidth, 400,
  281.             XmNheight, 400,
  282.             NULL);
  283.  
  284.         /* Create pulldowns for the menu bar */
  285.     pulldownshell = XtVaCreateWidget("pulldownshell", 
  286.                         xmMenuShellWidgetClass, Mainwin,
  287.                         XmNwidth, 1,
  288.                         XmNheight, 1,
  289.                         XmNallowShellResize, TRUE,
  290.                         XmNoverrideRedirect, TRUE,
  291.                         NULL );
  292.  
  293.     pulldown = XtVaCreateWidget( "m1", xmRowColumnWidgetClass,
  294.         pulldownshell, 
  295.         XmNrowColumnType, XmMENU_PULLDOWN,
  296.         XmNheight, 60, NULL);
  297.  
  298.     button = XtVaCreateManagedWidget( "OPTIONS", 
  299.             xmCascadeButtonWidgetClass, 
  300.             menubar,
  301.             XmNsubMenuId, pulldown, 
  302.             NULL);
  303.  
  304.     quit = XtVaCreateManagedWidget( "Quit", xmCascadeButtonWidgetClass, 
  305.         menubar,
  306.                 XmNlabelString, 
  307.                 (XmString *) XmStringCreate("QUIT", XmFONTLIST_DEFAULT_TAG), 
  308.                 NULL);
  309.  
  310.     XtAddCallback(quit, XmNactivateCallback, quit_action, NULL);
  311.  
  312.     pbutton3 = XtVaCreateManagedWidget("selection 3", 
  313.         xmPushButtonWidgetClass, pulldown,
  314.                 XmNlabelString,
  315.                 (XmString *) XmStringCreate("Switch to single buffered", 
  316.                          XmFONTLIST_DEFAULT_TAG),
  317.                 NULL);
  318.  
  319.     XtAddCallback(pbutton3, XmNactivateCallback, pbutton3_action, NULL);
  320.  
  321.     pbutton4 = XtVaCreateManagedWidget("selection 4", 
  322.         xmPushButtonWidgetClass, pulldown,
  323.                 XmNlabelString,
  324.                 (XmString *) XmStringCreate("Switch to double buffered", 
  325.                                  XmFONTLIST_DEFAULT_TAG),
  326.                 NULL);
  327.  
  328.     XtAddCallback(pbutton4, XmNactivateCallback, pbutton4_action, NULL);
  329.  
  330.     pbutton5 = XtVaCreateManagedWidget("selection 5", 
  331.         xmPushButtonWidgetClass, pulldown,
  332.                 XmNlabelString,
  333.                 (XmString *) XmStringCreate("Redraw 100 times", 
  334.                          XmFONTLIST_DEFAULT_TAG),
  335.                 NULL);
  336.  
  337.     XtAddCallback(pbutton5, XmNactivateCallback, pbutton5_action, NULL);
  338.  
  339.         XtRealizeWidget(TopLevel);
  340.  
  341.     while(True) {
  342.         XtAppNextEvent(appContext, &queue_event);
  343.         XtDispatchEvent(&queue_event);
  344.     }
  345. }
  346.